package jackie.testReflect;

import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

/**
 * Created by jackie on 2016/7/14.
 */
public class TestReflect<T> {
    public static void main(String args[]) throws NoSuchFieldException, IllegalAccessException, InstantiationException, ClassNotFoundException {
        Message m1 = new Message();
        Message m2 = new Message();
        List<Message> list = new ArrayList<>();
        list.add(m1);
        list.add(m2);
        ////这里是我测试通过集合类工具加工的不可修改List是否会影响泛型传递后的对象,
        // 不过显然不会,只是对List的修改做了限制。unmodifiableList的使用场景请自行百度
        List<Message> unmodifiedList = Collections.unmodifiableList(list);
        //所以这里如果业务没涉及可以不管，下面方法的传参unmodifiableList可以改成list。
        new TestReflect<Message>().printObjectValue(unmodifiedList, Message.class.getName());
    }

    /**
     *
     * @param object
     * @param className
     * @throws ClassNotFoundException
     * @throws IllegalAccessException
     * @throws InstantiationException
     */
    public void printObjectValue(List<T> object, String className) throws ClassNotFoundException, IllegalAccessException, InstantiationException {
        Object ot = Class.forName(className).newInstance();
        Class c = ot.getClass();
        Field[] fields = c.getDeclaredFields();//取得所有类成员变量

//        //遍历所有类成员变量
//        for (Field f:fields
//             ) {
//            System.out.println(f.getName());
//        }
//        //遍历所有方法
//        Method[] methods = c.getMethods();
//        for (Method m:methods
//             ) {
//            System.out.println(m.getName());
//        }

        //取消每个属性的安全检查
        for(Field f:fields){
            f.setAccessible(true);
        }

        //打印传入的每个对象的所有类成员属性值
        for (int j = 0; j < object.size(); j++)
            for (int i = 0; i < fields.length; i++) {
                try {
                    System.out.println(fields[i].getName() + ":" + fields[i].get(object.get(j)));
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
    }
}
